package dao;

import anno.Component;
import com.fasterxml.jackson.databind.ObjectMapper;
import pojo.Course;
import utils.JDBCUtils;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import static com.alibaba.druid.util.JdbcUtils.executeQuery;
import static utils.JDBCUtils.executePageQuery;

@Component
public class CourseDAO extends AbstractBaseDao<Course> {
    /**
     * 根据课程名称模糊查询课程列表
     *
     * @param courseName 课程名称
     * @return 符合条件的课程列表
     * @throws SQLException 数据库异常
     */
    public List<Course> findByCourseName(String courseName) throws SQLException {
        return findByField("courseName", courseName);
    }

    /**
     * 根据教师ID查询课程列表
     *
     * @param teacherId 教师ID
     * @return 符合条件的课程列表
     * @throws SQLException 数据库异常
     */
    public List<Course> findByTeacherId(Integer teacherId) throws SQLException {
        return findByField("teacherId", teacherId);
    }

    /**
     * 分页查询课程列表（管理员权限）
     *
     * @param pageNum  页码
     * @param pageSize 每页记录数
     * @return 分页后的课程列表
     * @throws SQLException 数据库异常
     */
    public JDBCUtils.Page<Course> findCoursesByPage(int pageNum, int pageSize) throws SQLException {
        String sql = "SELECT * FROM tb_courses";
        return executePageQuery(sql, new JDBCUtils.Page<>(pageNum, pageSize), this::mapResultSetToEntity);
    }
    /**
     * 根据学生ID查询该学生有哪些课程
     *
     * @param studentId 学生ID
     * @return 该学生参与的课程列表
     * @throws SQLException 数据库异常
     */
    public List<Course> findCoursesByStudentId(Integer studentId) throws SQLException {
        String sql = "SELECT * FROM tb_courses";
        ResultSet rs = (ResultSet) JDBCUtils.execute(sql);
        List<Course> courses = new ArrayList<>();
        while (rs.next()) {
            Course course = mapResultSetToEntity(rs);
            List<Map<String, Object>> studentIds = parseStudentIds(course.getStudentIds());
            for (Map<String, Object> student : studentIds) {
                if (student.get("id").equals(studentId)) {
                    courses.add(course);
                    break;
                }
            }
        }
        return courses;
    }

    /**
     * 解析学生信息
     *
     * @param studentIdsJson 学生信息JSON字符串
     * @return 学生信息列表
     */
    private static final ObjectMapper objectMapper = new ObjectMapper();

    private List<Map<String, Object>> parseStudentIds(String studentIdsJson) {
        try {
            return objectMapper.readValue(studentIdsJson, List.class);
        } catch (Exception e) {
            e.printStackTrace();
            return new ArrayList<>();
        }
    }

    /**
     * 分页模糊查询课程列表（管理员和教师权限）
     *
     * @param teacherId 教师ID（可选）
     * @param keyword   关键词
     * @param pageNum   页码
     * @param pageSize  每页记录数
     * @return 分页后的课程列表
     * @throws SQLException 数据库异常
     */
    public JDBCUtils.Page<Course> findCoursesByPageAndName(Integer teacherId, String keyword, int pageNum, int pageSize) throws SQLException {
        String sql;
        Object[] params;
        if (teacherId != null) {
            sql = "SELECT * FROM tb_courses WHERE teacher_id = ? AND course_name LIKE ?";
            params = new Object[]{teacherId, "%" + keyword + "%"};
        } else {
            sql = "SELECT * FROM tb_courses WHERE course_name LIKE ?";
            params = new Object[]{"%" + keyword + "%"};
        }
        return executePageQuery(sql, new JDBCUtils.Page<>(pageNum, pageSize), this::mapResultSetToEntity, params);
    }
}